
/*
    独立测试套件
    在测试套件类中，可以定义成员变量。只有当单元测试的总名称与该类名相同时，才可以访问
*/
#include <iostream>
#include <unordered_map>
#include <gtest/gtest.h>


class MyTest : public testing::Test
{
public:
    // 这两个静态函数名称时固定的
    static void SetUpTestCase()
    {
        std::cout << "所有单元测试执行前，初始化总环境\n";
    }
    static void TearDownTestCase()
    {
        std::cout << "所有单元测试执行完毕后，清理总环境\n";
    }
    // 仍然可以重写这两个虚函数
    // 单元测试初始化和清理
    void SetUp() override
    {
        std::cout << "单元测试初始化!!!\n";
        _mymap.insert(std::make_pair("hello", "你好"));
        _mymap.insert(std::make_pair("奥迪a6", "成功男人的标配"));
    }
    void TearDown() override
    {
        std::cout << "单元测试清理!!!\n";
    }

public:
    std::unordered_map<std::string, std::string> _mymap;
};

// 单元测试名称必须和类名一样，才可以访问类内成员变量
// 但是每个单元测试都是独立的，都会调用单元测试初始化
TEST_F(MyTest, insert_test)
{
    // 在这里添加，其他单元测试是不受影响的
    _mymap.insert(std::make_pair("24岁", "靠自己拥有一辆自己喜欢的车"));
    ASSERT_EQ(_mymap.size(), 3);
}
TEST_F(MyTest, size_test)
{
    ASSERT_EQ(_mymap.size(), 2);
}

// //单元测试名称必须和类名一样，才可以访问类内成员变量
// TEST_F(MyTest,insert_test)
// {
//     //在这里添加，其他单元测试是不受影响的
//     _mymap.insert(std::make_pair("hello","你好"));
//     _mymap.insert(std::make_pair("奥迪a6","成功男人的标配"));
// }
// TEST_F(MyTest,size_test)
// {
//     ASSERT_EQ(_mymap.size(),2);
// }

int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    int ret = RUN_ALL_TESTS();
    return 0;
}

// 示例：当多个测试用例需要相同的设置（Setup）和清理（Teardown）代码时
//  （例如创建数据库连接、初始化对象、清理临时文件）
// class DatabaseTest : public ::testing::Test
// {
// protected:
//     void SetUp() override
//     {
//         // 在每个测试开始前运行
//         db = new Database();
//         db->Connect("test_db");
//         db->LoadTestData();
//     }
//     void TearDown() override
//     {
//         // 在每个测试结束后运行
//         db->Disconnect();
//         delete db;
//         db = nullptr;
//     }
//     Database *db; // 测试用例可以访问的共享资源
// };